#include <bits/stdc++.h>
#include <unistd.h>
#include <signal.h>
#include <wait.h>
using namespace std;



void PrintPending(const sigset_t& pending)
{
    for(int signo = 31;signo>0;signo--)
    {
        if(sigismember(&pending,signo))
        {
            cout<<"1";
        }
        else
        {
            cout<<0;
        }
    }
    cout<<"\n";
}

void handler(int signo)
{

    //通过这里我们可以看见，信号在被处理之前，pending表就置为0了。
    sigset_t pending;
    sigpending(&pending);
    cout<<"_________________________________"<<endl;
    PrintPending(pending);
    cout<<"_________________________________"<<endl;

    cout<<"get signal :"<<getpid()<<"  "<<signo<<endl;
}
int main()
{
    signal(2,handler);
    sigset_t set,oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigaddset(&set,2);
 
    sigprocmask(SIG_BLOCK,&set,&oset);
    

    sigset_t pending;
    int cnt = 0;
    while(true)
    {
        sigpending(&pending);
        cout<<"get signal :"<<getpid()<<"  "<<endl;
        PrintPending(pending);
        sleep(1);


        cnt++;
        if(cnt == 5)
        {
            cout<<"解除2号信号屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oset,nullptr);
        }
    }

//信号的
    // signal(2,handler);
    // cout<<"2号信号处理成自定义\n";
    // sleep(10);

    // signal(2,SIG_DFL);//让信号处理变回默认处理
    // signal(2,SIG_IGN);//让信号处理是被忽略
    // cout<<"2号信号恢复默认\n";
    // sleep(5); 
    return 0; 
}